import type { KnowledgeDetail } from '@/types/knowledge';

/**
 * 索引与优化知识点数据
 */
export const optimizationKnowledge: KnowledgeDetail[] = [
	{
		id: 1,
		title: '索引基础',
		description: '索引是提高数据库查询性能的重要工具，通过索引可以快速定位数据。',
		icon: '⚡',
		categoryId: 'sql-optimization',
		categoryName: '索引与优化',
		categoryIcon: '⚡',
		difficulty: '中级',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #f39c12 0%, #e67e22 100%)',
		keyPoints: [
			{
				point: '创建索引：CREATE INDEX index_name ON table_name (column_name)。',
				code: `-- 创建单列索引
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_user_id ON orders(user_id);
CREATE INDEX idx_products_category ON products(category_id);

-- 创建唯一索引
CREATE UNIQUE INDEX uk_users_username ON users(username);

-- 创建复合索引
CREATE INDEX idx_orders_user_date ON orders(user_id, order_date);`
			},
			{
				point: '索引类型：B-Tree索引（最常用）、Hash索引、全文索引等。',
				code: `-- B-Tree索引（默认，MySQL/PostgreSQL）
CREATE INDEX idx_name ON users(name);

-- Hash索引（MySQL MEMORY引擎，PostgreSQL）
CREATE INDEX idx_name USING HASH ON users(name);

-- 全文索引（MySQL）
CREATE FULLTEXT INDEX ft_content ON articles(content);

-- 空间索引（MySQL）
CREATE SPATIAL INDEX sp_location ON places(location);`
			},
			{
				point: '删除索引：DROP INDEX index_name ON table_name。',
				code: `-- 删除索引
DROP INDEX idx_users_email ON users;

-- PostgreSQL语法
DROP INDEX idx_users_email;

-- 注意：删除索引不会删除数据，只是删除索引结构`
			},
			{
				point: '索引的选择原则：为经常用于WHERE、JOIN、ORDER BY的列创建索引。',
				code: `-- 应该创建索引的情况：
-- 1. WHERE子句中的列
CREATE INDEX idx_users_status ON users(status);

-- 2. JOIN连接中的列
CREATE INDEX idx_orders_user_id ON orders(user_id);

-- 3. ORDER BY中的列
CREATE INDEX idx_products_price ON products(price);

-- 4. GROUP BY中的列
CREATE INDEX idx_orders_user_date ON orders(user_id, order_date);`
			},
			{
				point: '索引的代价：索引会占用存储空间，并影响INSERT/UPDATE/DELETE的性能。',
				code: `-- 索引的优缺点：
-- 优点：
-- - 加快查询速度（特别是大表）
-- - 加快JOIN操作
-- - 加快ORDER BY和GROUP BY

-- 缺点：
-- - 占用额外存储空间
-- - 降低INSERT/UPDATE/DELETE速度（需要维护索引）
-- - 索引过多会增加维护成本

-- 建议：不要过度索引，根据实际查询需求创建`
			}
		]
	},
	{
		id: 2,
		title: 'EXPLAIN查询计划',
		description: 'EXPLAIN用于分析SQL查询的执行计划，帮助优化查询性能。',
		icon: '📊',
		categoryId: 'sql-optimization',
		categoryName: '索引与优化',
		categoryIcon: '⚡',
		difficulty: '高级',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #e74c3c 0%, #c0392b 100%)',
		keyPoints: [
			{
				point: '使用EXPLAIN：在SELECT语句前加上EXPLAIN关键字查看执行计划。',
				code: `-- 查看查询计划
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

-- MySQL EXPLAIN输出包含：
-- - id: 查询ID
-- - select_type: 查询类型
-- - table: 表名
-- - type: 连接类型（ALL, index, range, ref等）
-- - possible_keys: 可能使用的索引
-- - key: 实际使用的索引
-- - rows: 扫描的行数
-- - Extra: 额外信息`
			},
			{
				point: '分析执行计划：根据type和rows判断查询效率。',
				code: `-- type类型（从好到坏）：
-- system/const: 最优，单行查询
-- eq_ref: 唯一索引查找
-- ref: 非唯一索引查找
-- range: 范围扫描
-- index: 全索引扫描
-- ALL: 全表扫描（最差）

-- 优化目标：
-- - 避免type=ALL（全表扫描）
-- - 尽量减少rows（扫描行数）
-- - 使用索引（key不为NULL）`
			},
			{
				point: 'EXPLAIN ANALYZE：某些数据库支持实际执行查询并显示统计信息。',
				code: `-- PostgreSQL: EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

-- 输出包含实际执行时间：
-- - Execution Time: 实际执行时间
-- - Planning Time: 计划时间
-- - Buffers: 缓冲区使用情况`
			},
			{
				point: '索引使用情况：检查possible_keys和key字段，确认索引是否被使用。',
				code: `-- 检查索引使用
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
-- 如果key为NULL，说明没有使用索引，需要创建索引

-- 创建索引后再次检查
CREATE INDEX idx_users_email ON users(email);
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
-- 现在key应该显示idx_users_email`
			},
			{
				point: '优化查询：根据EXPLAIN结果调整查询或创建索引。',
				code: `-- 发现问题：type=ALL, rows=1000000（全表扫描）
EXPLAIN SELECT * FROM users WHERE status = 'active';
-- 解决方案：创建索引
CREATE INDEX idx_users_status ON users(status);

-- 再次检查：type=ref, rows=100（使用索引）
EXPLAIN SELECT * FROM users WHERE status = 'active';`
			}
		]
	}
];

